home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / fapxtool / src / txl / txlpswd.c < prev    next >
C/C++ Source or Header  |  1995-02-11  |  3KB  |  175 lines

  1. /***************
  2. *
  3. * g:\exe\txl\src\txlpswd.c
  4. */
  5. #include "txl.h"
  6.  
  7. unsigned char *get_use_string()
  8. {
  9.     int i, dst;
  10.     static unsigned char str[132];
  11.     srand(0);
  12.     strcpy(str, "!#%&@$~(^_-)/ヲ={}?,.*");
  13.     for (i = 'A'; i <= 'Z'; i++) {
  14.         str[21 + i - 'A'] = (char)(i);
  15.     }
  16.     for (i = '0'; i <= '9'; i++) {
  17.         str[47 + i - '0'] = (char)(i);
  18.     }
  19.     for (i = 'a'; i <= 'z'; i++) {
  20.         str[57 + i - 'a'] = (char)(i);
  21.     }
  22.     for (i = 'ア'; i <= 'ン'; i++) {
  23.         str[83 + i - 'ア'] = (char)(i);
  24.     }
  25.  
  26.     str[128] = NUL;
  27.     for (i = 0; i < 128; i++) {
  28.         dst = rand() % 128;
  29.         str[131] = str[i];
  30.         str[i] = str[dst];
  31.         str[dst] = str[131];
  32.     }
  33.  
  34.     return (str);
  35. }
  36.  
  37. int getposnum(int c)
  38. {
  39.     static unsigned char *str = NULL;
  40.     unsigned char *tmp;
  41.     if (str == NULL) {
  42.         str = get_use_string();
  43.     }
  44.     if ((tmp = strchr(str, c)) == NULL) {
  45.         return (-1);
  46.     }
  47.     return ((int)(tmp - str));
  48.  
  49. }
  50.  
  51. int getposchr(int c)
  52. {
  53.     static unsigned char *str = NULL;
  54.  
  55.     if (str == NULL) {
  56.         str = get_use_string();
  57.     }
  58.     if (c > 127) {
  59.         return (-1);
  60.     }
  61.     return (str[c]);
  62. }
  63.  
  64. void expand_passwd(char *val[])
  65. {
  66.     int pos, c, i, sum, len, c1, c2, c3, plen;
  67.     FILE *fw;
  68.     unsigned char passwd[16];
  69.     unsigned char code[32];
  70.  
  71.     for (i = 0; i < 16; i++) {
  72.         passwd[i] = 0;
  73.     }
  74.  
  75.     if ((fw = fopen(val[1], "wb")) == NULL) {
  76.         Exit(1);
  77.     }
  78.  
  79.     if (strlen(val[0]) > 31) {
  80.         fputs("Error", fw);
  81.         fclose(fw);
  82.         Exit(1);    /* コードデータが長過ぎ */
  83.     }
  84.     strcpy(code, val[0]);
  85.     len = strlen(code);
  86.  
  87.     sum = 0;
  88.     for (i = 0; i < len - 2; i++) {
  89.         sum += code[i];
  90.     }
  91.     if (code[len - 2] != getposchr(sum / 128) ||
  92.             code[len - 1] != getposchr(sum % 128)) {
  93.         fputs("Error(SUM)", fw);
  94.         fclose(fw);
  95.         Exit(1);
  96.     }
  97.     if (code[0] != '0') {
  98.         fputs("Error(TAG)", fw);
  99.         fclose(fw);
  100.         Exit(1);
  101.     }
  102.     c1 = getposnum(code[1]);
  103.     c2 = getposnum(code[2]);
  104.     c3 = getposnum(code[3]);
  105.     plen = (128 + c3 - abs(c1 - c2)) % 128;
  106.     if (plen > 9) {
  107.         fputs("Error(LENGTH)", fw);
  108.         fclose(fw);
  109.         Exit(1);
  110.     }
  111.  
  112.     c = (abs(c3 - c1) + plen) % 128;
  113.     pos = 0;
  114.     for (i = 4; i < 4 + plen; i++) {
  115.         c1 = getposnum(code[i]);
  116.         passwd[pos++] = (c1 + c + i - 4) + 1;
  117.     }                                    /* ↑ 1スライド */
  118.  
  119.     fputs(passwd, fw);
  120.     fclose(fw);
  121.     Exit(0);
  122. }
  123.  
  124. void compress_passwd(char *val[])
  125. {
  126.     int pos, c, i, sum, c1, c2, c3;
  127.     FILE *fw;
  128.     unsigned char passwd[16];
  129.     unsigned char code[32];
  130.  
  131.     getposchr(0);        /* 初回はrandを初期化するのでダミー呼び出し */
  132.     getposnum('0');        /* 上に同じ */
  133.     srand((unsigned int)(clock() & 0x0ffff));
  134.     for (i = 1; i < 32; i++) {
  135.         code[i] = 0;
  136.     }
  137.     pos = 0;
  138.     code[pos++] = '0';
  139.  
  140.     if ((fw = fopen(val[1], "wb")) == NULL) {
  141.         Exit(1);
  142.     }
  143.  
  144.     if (strlen(val[0]) > 9) {
  145.         fputs("Error(LENGTH)", fw);
  146.         fclose(fw);
  147.         Exit(1);    /* パスワードが長過ぎ */
  148.     }
  149.     strcpy(passwd, val[0]);
  150.     while (strlen(passwd) < 10) {
  151.         strncat(passwd, val[0], 10 - strlen(passwd));
  152.     }
  153.     c1 = rand() % 128;
  154.     c2 = rand() % 128;
  155.     c3 = (abs(c1 - c2) + strlen(val[0])) % 128;
  156.     code[pos++] = getposchr(c1);
  157.     code[pos++] = getposchr(c2);
  158.     code[pos++] = getposchr(c3);
  159.  
  160.     c = (abs(c3 - c1) + strlen(val[0])) % 128;
  161.     for (i = 0; i < 10; i++) {
  162.         code[pos++] = getposchr((256 + passwd[i] - c - i) % 128);
  163.     }
  164.     sum = 0;
  165.     for (i = 0; code[i] != NUL; i++) {
  166.         sum += code[i];
  167.     }
  168.     code[pos++] = getposchr(sum / 128);
  169.     code[pos++] = getposchr(sum % 128);
  170.     fputs(code, fw);
  171.     fclose(fw);
  172.     Exit(0);
  173. }
  174.  
  175.